# nbconvert-ignore
# === Helper to embed Plotly figures directly in HTML exports ===
import plotly.io as pio
from IPython.display import HTML
# Fallback renderer helps when exporting via nbconvert
pio.renderers.default = "plotly_mimetype"
def show_embed(fig):
return HTML(pio.to_html(fig, include_plotlyjs='inline', full_html=False))
📈 Projet — Évolution des ETF visant le secteur de l'énergie
- Introduction rapide et présentation des données utilisées
- Analyse des rendements des ETF
- Évolution normalisée en base 100
- Corrélations sur les différentes périodes
- Analyse graphique volatilité / rendement
🔹 Introduction
Au cours des dernières années, la transition énergétique est devenue un enjeu économique majeur. Les investisseurs se tournent de plus en plus vers des fonds indiciels (ETF) liés aux énergies renouvelables, tout en restant attentifs à la performance des énergies fossiles et aux nouvelles technologies comme les technologies de stockage.
Un Exchange Traded Fund (ETF) est un fonds indiciel coté en bourse qui réplique la performance d’un indice (par exemple, un secteur, une zone géographique ou une thématique). Il permet aux investisseurs d’obtenir une exposition diversifiée à moindre coût.
- IXC — Énergies fossiles (pétrole et gaz)
- ICLN — Énergies renouvelables
- LIT — Stockage de l’énergie (batteries lithium)
De 2015 à 2024, en distinguant les périodes avant, pendant et après la crise du Covid-19.
#Importation des librairies nécessaires
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import plotly.express as px
import seaborn as sns
import numpy as np
#Télécharger les cours des ETF
tickers = ['IXC','ICLN','LIT']
data = yf.download(tickers, start='2015-01-01', end='2024-12-31')
data = data['Close']
#Afficher les premières lignes des données
print(data.head())
C:\Users\Victor\AppData\Local\Temp\ipykernel_5936\2166598355.py:4: FutureWarning: YF.download() has changed argument auto_adjust default to True [*********************100%***********************] 3 of 3 completed
Ticker ICLN IXC LIT Date 2015-01-02 8.039236 24.319496 19.526278 2015-01-05 7.866085 23.254177 19.109718 2015-01-06 7.849592 22.986208 19.109718 2015-01-07 7.923801 23.051567 19.109718 2015-01-08 8.113444 23.541750 19.335352
#vérifier les données manquantes
print(data.isnull().sum())
Ticker ICLN 0 IXC 0 LIT 0 dtype: int64
#Calculer les rendements quotidiens
returns = data.pct_change().dropna()
print(returns.head())
Ticker ICLN IXC LIT Date 2015-01-05 -0.021538 -0.043805 -0.021333 2015-01-06 -0.002097 -0.011523 0.000000 2015-01-07 0.009454 0.002843 0.000000 2015-01-08 0.023933 0.021265 0.011807 2015-01-09 -0.003049 -0.008884 -0.000897
🔹 Rendements quotidiens des ETF
Cette section met en évidence l’évolution des rendements journaliers des trois ETF liés à l’énergie : IXC (énergies fossiles), ICLN (énergies renouvelables) et LIT (technologies de stockage et batteries). L’objectif est de comparer leur dynamique de variation au fil du temps et de voir comment chaque segment réagit aux différentes phases du marché énergétique.
import plotly.express as px
# Mise au format long pour Plotly
returns_long = returns[['IXC', 'ICLN', 'LIT']].reset_index().melt(
id_vars='Date',
value_vars=['IXC', 'ICLN', 'LIT'],
var_name='ETF',
value_name='Rendement'
)
# Mapping pour noms lisibles
mapping_energie = {
'IXC': 'Énergies fossiles',
'ICLN': 'Énergies renouvelables',
'LIT': 'Technologies de stockage'
}
returns_long['Type d’énergie'] = returns_long['ETF'].map(mapping_energie)
# Couleurs harmonisées (identiques à tes autres visuels)
couleurs = {
'Énergies fossiles': '#f59e0b',
'Énergies renouvelables': '#16a34a',
'Technologies de stockage': '#2563eb'
}
# Graphique interactif
fig = px.line(
returns_long,
x='Date',
y='Rendement',
color='Type d’énergie',
color_discrete_map=couleurs,
title="<b>Évolution des rendements quotidiens</b> — Comparaison <b>Fossiles / Renouvelables / Stockage</b>",
labels={'Date': 'Année', 'Rendement': 'Rendement quotidien'}
)
# Masquer toutes les courbes au démarrage
fig.for_each_trace(lambda t: t.update(visible='legendonly'))
# Mise en page et design
fig.update_layout(
template='plotly_white',
title_x=0.5,
font=dict(size=13, family='Inter, Arial, sans-serif', color='#1f2937'),
plot_bgcolor='#f5f5f5',
paper_bgcolor='white',
height=500,
margin=dict(l=40, r=40, t=80, b=70),
# ✅ Légende claire et cohérente
legend=dict(
title=dict(
text='<b>Type d’énergie</b>',
font=dict(size=13, color='#1f2937')
),
font=dict(size=12.5, color='#374151', family='Inter, Arial, sans-serif'),
orientation="h",
y=-0.28,
x=0.25,
bgcolor='rgba(255,255,255,0.65)',
bordercolor='rgba(0,0,0,0.05)',
borderwidth=1
)
)
# Ajout d’une note d’instruction
fig.add_annotation(
text="💡 Cliquez sur la légende pour afficher ou masquer les courbes",
xref="paper", yref="paper",
x=0.5, y=-0.22,
showarrow=False,
font=dict(color="gray", size=12)
)
# Grilles plus subtiles
fig.update_xaxes(showgrid=True, gridcolor='#d0d0d0', zeroline=False)
fig.update_yaxes(showgrid=True, gridcolor='#d0d0d0', zeroline=False)
show_embed(fig)
En résumé : les rendements présentent une forte instabilité pendant la période Covid, marquée par des fluctuations quotidiennes importantes. On remarque cependant que l’ETF pétrolier (IXC) a connu le pic le plus faible en termes de rendement quotidien, alors que l’ETF ICLN (renouvelables) s’est montré beaucoup plus volatil. Ces différences traduisent la réactivité contrastée des marchés énergétiques face à la crise.
🔹 Évolution normalisée en base 100
Cette section met en perspective l’évolution des trois ETF énergétiques,
IXC (énergies fossiles),
ICLN (énergies renouvelables) et
LIT (technologies de stockage),
après une normalisation en base 100.
Cette méthode permet de comparer directement leur performance relative,
sans tenir compte du prix de départ, et de mieux visualiser
comment les trajectoires de chaque secteur ont divergé au fil du temps.
On peut ainsi observer plus clairement les différences de dynamique entre
fossiles, renouvelables et stockage d’énergie
sur l’ensemble de la période étudiée.
import plotly.express as px
import pandas as pd
# Normalisation base 100
normalized = data / data.iloc[0] * 100
# Mise au format long pour Plotly
normalized_long = normalized.reset_index().melt(
id_vars='Date',
value_vars=['IXC', 'ICLN', 'LIT'],
var_name='ETF',
value_name='Indice (Base 100)'
)
# Mapping pour noms lisibles
mapping_energie = {
'IXC': 'Énergies fossiles',
'ICLN': 'Énergies renouvelables',
'LIT': 'Technologies de stockage'
}
normalized_long['Type d’énergie'] = normalized_long['ETF'].map(mapping_energie)
# Couleurs harmonisées
couleurs = {
'Énergies fossiles': '#f59e0b',
'Énergies renouvelables': '#16a34a',
'Technologies de stockage': '#2563eb'
}
# Graphique
fig = px.line(
normalized_long,
x='Date',
y='Indice (Base 100)',
color='Type d’énergie',
color_discrete_map=couleurs,
title="<b>Évolution normalisée (base 100)</b> — Comparaison <b>Fossiles / Renouvelables / Stockage</b>",
labels={'Date': 'Année', 'Indice (Base 100)': 'Indice (Base 100)'}
)
# Mise en forme générale
fig.update_layout(
template='plotly_white',
plot_bgcolor='#f5f5f5',
paper_bgcolor='white',
title_x=0.5,
font=dict(size=13, family='Inter, Arial, sans-serif', color='#1f2937'),
# ✅ Légende lisible et esthétique
legend=dict(
title=dict(
text='<b>Type d’énergie</b>',
font=dict(size=13, color='#1f2937')
),
font=dict(size=12.5, color='#374151', family='Inter, Arial, sans-serif'),
orientation="h",
y=-0.25,
x=0.25,
bgcolor='rgba(255,255,255,0.65)',
bordercolor='rgba(0,0,0,0.05)',
borderwidth=1
),
height=600,
margin=dict(l=40, r=40, t=80, b=60)
)
# Grilles légères
fig.update_xaxes(showgrid=True, gridcolor='#d0d0d0', zeroline=False)
fig.update_yaxes(showgrid=True, gridcolor='#d0d0d0', zeroline=False)
show_embed(fig)
En résumé : on observe que les énergies renouvelables et les technologies de stockage ont connu une hausse spectaculaire en 2020, avec un indice qui a triplé sur l’année. À l’inverse, l’ETF pétrolier (IXC) a subi une baisse marquée, tombant autour de 40 points (en base 100) au plus fort de la crise. Cette évolution illustre parfaitement la divergence de trajectoire entre énergies fossiles et “nouvelles technologies” face aux chocs .
🔹 Analyse des corrélations par périodes
On examine ici les corrélations entre les rendements des ETF énergétiques (IXC, ICLN et LIT) au cours de trois périodes distinctes : avant, pendant et après la crise du Covid-19. L’objectif est d’observer comment les relations entre les différentes formes d’énergie ont évolué dans le temps, en mettant en évidence les phases de corrélation élevée (marchés synchronisés) et de décorrélation (diversification accrue).
# 3 périodes
import plotly.express as px
from plotly.subplots import make_subplots
import plotly.graph_objects as go
# --- Séparer les périodes ---
data_pre_covid = data[data.index < '2020-01-01']
data_covid = data[(data.index >= '2020-01-01') & (data.index < '2021-01-01')]
data_post_covid = data[data.index >= '2021-01-01']
# --- Calcul des rendements journaliers ---
returns_pre_covid = data_pre_covid.pct_change().dropna()
returns_covid = data_covid.pct_change().dropna()
returns_post_covid = data_post_covid.pct_change().dropna()
# --- Corrélations ---
rename_map = {
'ICLN': 'Renouvelables',
'IXC': 'Fossiles',
'LIT': 'Stockages'
}
corr_pre_covid = returns_pre_covid.corr().rename(index=rename_map, columns=rename_map).round(2)
corr_covid = returns_covid.corr().rename( index=rename_map, columns=rename_map).round(2)
corr_post_covid= returns_post_covid.corr().rename(index=rename_map, columns=rename_map).round(2)
# --- Figure responsive (pas de width/height fixes) ---
fig = make_subplots(
rows=1, cols=3,
subplot_titles=("Avant Covid (2015-2020)", "Pendant Covid (2020)", "Après Covid (2021-2025)"),
horizontal_spacing=0.08 # un peu plus serré pour tenir dans le conteneur
)
# --- Heatmaps ---
heatmap_pre = go.Heatmap(
z=corr_pre_covid.values, x=corr_pre_covid.columns, y=corr_pre_covid.index,
text=corr_pre_covid.values, texttemplate="%{text:.2f}",
colorscale="RdBu_r", zmin=-1, zmax=1,
colorbar=dict(title="Corrélation", x=1.02, len=0.85, thickness=14, xpad=8)
)
heatmap_covid = go.Heatmap(
z=corr_covid.values, x=corr_covid.columns, y=corr_covid.index,
text=corr_covid.values, texttemplate="%{text:.2f}",
colorscale="RdBu_r", zmin=-1, zmax=1,
showscale=False
)
heatmap_post = go.Heatmap(
z=corr_post_covid.values, x=corr_post_covid.columns, y=corr_post_covid.index,
text=corr_post_covid.values, texttemplate="%{text:.2f}",
colorscale="RdBu_r", zmin=-1, zmax=1,
showscale=False
)
fig.add_trace(heatmap_pre, row=1, col=1)
fig.add_trace(heatmap_covid, row=1, col=2)
fig.add_trace(heatmap_post, row=1, col=3)
# --- Mise en forme (sans dimensions fixes) ---
fig.update_layout(
title_text="<b>Comparaison des corrélations des rendements journaliers avant, pendant et après Covid</b>",
title_x=0.5,
title_font=dict(size=16),
margin=dict(l=40, r=40, t=60, b=40),
plot_bgcolor="white",
)
# --- Police un peu plus petite pour tenir sur petite largeur ---
fig.update_xaxes(tickfont=dict(size=11))
fig.update_yaxes(tickfont=dict(size=11))
show_embed(fig)
En résumé : avant la crise Covid, les corrélations entre les trois ETF restaient limitées, chaque segment évoluait de manière indépendante. En 2020, la corrélation grimpe nettement, preuve d’une réaction commune face au choc global. Après 2021, les corrélations diminuent à nouveau, marquant un retour à des dynamiques sectorielles différenciées.
🔹 Analyse de la volatilité
Étude comparative de la volatilité annuelle et du profil de risque des ETF énergétiques (IXC, ICLN, LIT), pour identifier les actifs les plus stables sur la période post-Covid.
import pandas as pd
import plotly.express as px
# 1) Volatilité annualisée (post-Covid) — en %
volatilite = returns_post_covid.std() * (252 ** 0.5) # annualisée
vol_df = pd.DataFrame({
"Type d'énergie": ["Énergies fossiles", "Renouvelables", "Batteries/ Métaux stratégiques"],
"Volatilité annuelle (%)": (volatilite[['IXC','ICLN','LIT']].reindex(['IXC','ICLN','LIT']).values * 100).round(2),
"Ticker": ["IXC", "ICLN", "LIT"]
})
# 2) Tri décroissant pour lecture immédiate
vol_df = vol_df.sort_values("Volatilité annuelle (%)", ascending=False).reset_index(drop=True)
# 3) Palette cohérente avec le reste du notebook
couleurs = {
"Énergies fossiles": "#f59e0b", # orange (IXC)
"Renouvelables": "#16a34a", # vert (ICLN)
"Batteries/ Métaux stratégiques": "#2563eb" # bleu (LIT)
}
# 4) Graphique
fig = px.bar(
vol_df,
x="Type d'énergie",
y="Volatilité annuelle (%)",
color="Type d'énergie",
color_discrete_map=couleurs,
hover_data={"Ticker": True, "Volatilité annuelle (%)": ':.2f', "Type d'énergie": False},
title="<b>Volatilité annualisée des ETF énergétiques</b><br><span style='font-size:12px;color:#6b7280;'>Période post-Covid (annualisée, %) — lecture facilitée</span>",
)
# 5) Rendre les valeurs lisibles et garder l’ordre trié
fig.update_traces(
texttemplate="%{y:.2f}%",
textposition="outside",
hovertemplate="<b>%{customdata[0]}</b> — %{x}<br>Volatilité : %{y:.2f}%<extra></extra>"
)
# 6) Mise en forme : fond + grilles + légende
fig.update_layout(
template="plotly_white",
plot_bgcolor="#f5f5f5", # fond de la zone de tracé
paper_bgcolor="white",
title_x=0.5,
font=dict(size=13),
showlegend=False, # inutile ici (couleur = libellé des barres)
margin=dict(l=60, r=40, t=80, b=60),
uniformtext_minsize=10,
uniformtext_mode="hide",
xaxis=dict(
categoryorder="array",
categoryarray=vol_df["Type d'énergie"].tolist(),
title=None
),
yaxis=dict(
title="Volatilité annualisée (%)",
rangemode="tozero"
),
height=480
)
# 7) Grilles visibles
fig.update_xaxes(showgrid=True, gridcolor="#d0d0d0", zeroline=False)
fig.update_yaxes(showgrid=True, gridcolor="#d0d0d0", zeroline=False)
# 8) Ligne de référence : moyenne des 3
moy = vol_df["Volatilité annuelle (%)"].mean().round(2)
fig.add_hline(
y=moy, line_dash="dot", line_color="#6b7280",
annotation_text=f"Moyenne : {moy:.2f}%", annotation_position="top left",
annotation_font=dict(size=11, color="#6b7280")
)
show_embed(fig)
En résumé : après la période Covid, la volatilité des rendements diminue nettement par rapport à la période précédente (~50%), signe d’un retour progressif à la stabilité sur les marchés de l’énergie. Les ETF renouvelables restent toutefois un peu plus instables que les fossiles, reflet d’un secteur encore sensible aux décisions politiques et aux annonces environnementales. Enfin, les technologies de stockage affichent la volatilité la plus marquée, liée au rebond qui a suivi leur forte hausse pendant les politiques de relance mondiale.
🔹 Analyse du ratio rendement / volatilité sur les trois périodes
Cette section évalue le rapport rendement / risque des ETF énergétiques (IXC, ICLN et LIT) sur les trois périodes de l’étude avant, pendant et après la crise du Covid afin d’identifier quels actifs offrent la meilleure efficacité risque / performance.
import pandas as pd
import numpy as np
import plotly.express as px
from plotly.subplots import make_subplots
import plotly.graph_objects as go
# --- Calculs annuels (inchangés) ---
moy_rendement1 = returns_pre_covid.mean() * 252
moy_rendement2 = returns_covid.mean() * 252
moy_rendement3 = returns_post_covid.mean() * 252
volatilite1 = returns_pre_covid.std() * (252 ** 0.5)
volatilite2 = returns_covid.std() * (252 ** 0.5)
volatilite3 = returns_post_covid.std() * (252 ** 0.5)
# --- Associer les ETF à leur type d'énergie ---
mapping_energie = {
'IXC': 'Fossiles',
'ICLN': 'Renouvelables',
'LIT': 'Stockages/ Batteries'
}
# --- Construction des DataFrames ---
def construire_df(moy, vol):
return pd.DataFrame({
"ETF": moy.index,
"Type d'énergie": [mapping_energie[t] for t in moy.index],
"Rendement annuel (%)": (moy.values * 100).round(2),
"Volatilité annuelle (%)": (vol.values * 100).round(2),
"Taille": np.abs(moy.values * 100)
})
df_pre = construire_df(moy_rendement1, volatilite1)
df_pendant = construire_df(moy_rendement2, volatilite2)
df_post = construire_df(moy_rendement3, volatilite3)
# --- Création des 3 scatter plots ---
def create_scatter(df, titre):
fig = px.scatter(
df,
x="Volatilité annuelle (%)",
y="Rendement annuel (%)",
size="Taille",
color="Type d'énergie",
text="ETF",
hover_name="Type d'énergie",
color_discrete_map={
"Renouvelables": "#00CC96",
"Fossiles": "#EF553B",
"Batteries": "#636EFA"
},
title=titre
)
fig.update_traces(
textposition="top center",
marker=dict(line=dict(width=1, color='black')),
opacity=0.85
)
return fig
fig_pre = create_scatter(df_pre, "Avant Covid (2015–2020)")
fig_pendant = create_scatter(df_pendant, "Pendant Covid (2020)")
fig_post = create_scatter(df_post, "Après Covid (2021–2025)")
# --- Création du subplot global ---
fig = make_subplots(
rows=1, cols=3,
subplot_titles=("Avant Covid (2015–2020)", "Pendant Covid (2020)", "Après Covid (2021–2025)"),
horizontal_spacing=0.12
)
# Ajouter les traces
for trace in fig_pre.data:
fig.add_trace(trace, row=1, col=1)
for trace in fig_pendant.data:
fig.add_trace(trace, row=1, col=2)
for trace in fig_post.data:
fig.add_trace(trace, row=1, col=3)
# --- Légende unique ---
seen = set()
for tr in fig.data:
name = tr.name
tr.legendgroup = name
if name in seen:
tr.showlegend = False
else:
tr.showlegend = True
seen.add(name)
# --- Mise en forme globale ---
fig.update_layout(
title_text="<b>Comparaison des rendements et volatilités des ETF énergétiques avant, pendant et après la crise du Covid</b>",
title_x=0.5,
title_font=dict(size=18),
font=dict(size=12),
height=600,
width=1800,
margin=dict(l=60, r=40, t=80, b=80),
plot_bgcolor="white",
paper_bgcolor="white",
legend_title_text="Type d'énergie",
legend=dict(
orientation="h",
y=-0.18,
x=0.5, xanchor="center",
bgcolor="rgba(255,255,255,0.7)",
bordercolor="lightgray",
borderwidth=1
)
)
# --- Axes indépendants pour chaque graphe (comme dans ton code d’origine) ---
for i in range(1, 4):
fig.update_xaxes(
title_text="Volatilité annuelle (%)",
gridcolor="lightgray",
zeroline=True, zerolinecolor="lightgray",
row=1, col=i
)
fig.update_yaxes(
title_text="Rendement annuel (%)",
gridcolor="lightgray",
zeroline=True, zerolinecolor="lightgray",
row=1, col=i
)
show_embed(fig)
En résumé : le rebond amorcé par les énergies vertes après la crise Covid n’est toujours pas pleinement consolidé en 2024. Le graphique montre que ces actifs présentent encore un rendement négatif associé à une volatilité plus élevée que celle des énergies fossiles. Cette différence s’explique par la stabilité relative du pétrole sur le long terme, même si, en période de crise, il réagit violemment avec un rendement pouvant atteindre -22 % en 2020, ce qui représente une perte majeure pour les investisseurs. À l’inverse, sur une période plus calme comme la phase pré-Covid, les énergies vertes se distinguent par un meilleur couple rendement/risque, les rendant plus attractives dans un contexte de marché stable.
✅ Conclusion
L’analyse des trois ETF étudiés IXC (énergies fossiles), ICLN (énergies renouvelables) et LIT (stockage de l’énergie) met en évidence des dynamiques de marché contrastées entre les différentes formes d’énergie.
- Avant Covid-19 : corrélations relativement fortes → évolution commune portée par la croissance mondiale.
- Après la pandémie : affaiblissement partiel, surtout entre fossiles et nouvelles technologies → diversification accrue du secteur, changement de tendance
- Renouvelables (ICLN) & Stockage (LIT) : forte progression post-crise, soutenue par la transition énergétique et l’investissement vert.
- Fossiles (IXC) : rebond marqué en 2022, mais profil plus volatil et sensible au contexte géopolitique.
- Privilégier ICLN & LIT (potentiel de croissance + thèse structurelle).
- Viser une exposition progressive et diversifiée.
- IXC pertinent comme hedge face aux chocs énergétiques.
- Surveiller la volatilité et le contexte géopolitique.